package com.wei.czz.framework.admin.controller;

import com.wei.czz.common.annotation.Auth;
import com.wei.czz.common.dto.admin.DeptUserDto;
import com.wei.czz.common.dto.admin.UserDto;
import com.wei.czz.common.dto.admin.deptUser.DeptUserPageEnumDto;
import com.wei.czz.common.jsr303.group.OrderSearch;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.utils.RegexUtils;
import com.wei.czz.common.vo.admin.deptUser.DeptUserFormVo;
import com.wei.czz.framework.admin.manager.DeptUserManager;
import com.wei.czz.framework.admin.manager.UserManager;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Objects;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2022-08-19 15:52:59
 * className: DeptUserController 部门与用户请求操作接口类
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("sys/dept-user")
@AllArgsConstructor
public class DeptUserController {

    private static final Logger log = LoggerFactory.getLogger(DeptUserController.class);

    private final DeptUserManager deptUserManager;

    private final UserManager userManager;

    /**
     * 分页获取部门用户接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-部门关联用户管理页面调用
     *
     * @param deptUserFormVo 用户查询参数对象
     * @return 用户分页数据
     */
    @PostMapping("/page/list")
    @Auth(permit = "system:dept-user:list")
    public Result<PageDto<UserDto>> getDeptUserPageList(
            @Validated(OrderSearch.class) @RequestBody DeptUserFormVo deptUserFormVo) {
        log.info("开始分页获取部门用户业务。{}", deptUserFormVo);

        if (Objects.isNull(deptUserFormVo.getDeptId())) {
            log.info("部门主键不能为空");
            return Result.clientFail("部门主键不能为空");
        }
        if (StringUtils.isNotBlank(deptUserFormVo.getContact())) {
            /*
                正则判断检索类型用户登录账号
             */
            // 正则判断是否是手机号
            boolean bool = RegexUtils.isPhone(deptUserFormVo.getContact());
            if (!bool) {
                // 正则判断是否是邮箱号
                bool = RegexUtils.isEmail(deptUserFormVo.getContact());
            }
            if (!bool) {
                return Result.clientFail("请输入正确的手机号或者邮箱号进行检索");
            }
        }

        PageDto<UserDto> page = userManager.getDeptUserPageList(deptUserFormVo);

        log.info("分页获取部门用户业务结束");
        return Result.success(page);
    }

    /**
     * 获取部门关联用户管理页面枚举接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-部门关联用户管理页面调用
     * @return 结果
     */
    @GetMapping("/page/param")
    @Auth(permit = "system:dept-user:list")
    public Result<DeptUserPageEnumDto> getDeptUserPageEnum(@RequestParam("deptId") Long deptId) {
        log.info("开始获取部门关联用户管理页面枚举业务");

        DeptUserPageEnumDto deptUserPageEnumDto = deptUserManager.getDeptUserPageEnum(deptId);

        log.info("获取部门关联用户管理页面枚举业务结束");
        return Result.success(deptUserPageEnumDto);
    }

    /**
     * 查询部门关联用户数据列表接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-部门管理页-部门关联用户管理弹出框中调用
     *
     * @param deptId 部门主键
     * @return 部门关联用户数据列表
     */
    @GetMapping("/list")
    @Auth(permit = "system:dept-user:list")
    public Result<List<DeptUserDto>> getDeptUserList(@RequestParam("deptId") Long deptId) {
        log.info("开始查询部门关联用户数据列表业务。deptId={}", deptId);

        List<DeptUserDto> deptUserDtoList = userManager.getDeptUserList(deptId);

        log.info("查询部门关联用户数据列表业务结束");
        return Result.success(deptUserDtoList);
    }

    /**
     * 获取部门关联用户接口
     * 根据部门主键，获取部门关联用户
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-用户管理页-批量用户切换部门弹出框中调用
     * @param deptId 部门主键
     * @return 用户简单数据
     */
    @GetMapping("/simple/list")
    @Auth(permit = "user:move:opt")
    public Result<List<UserDto>> getSimpleDeptUserList(@RequestParam("deptId") Long deptId) {
        log.info("开始获取部门关联用户业务。deptId={}", deptId);

        List<UserDto> userDtoList = deptUserManager.getSimpleDeptUserList(deptId);

        log.info("获取部门关联用户业务结束");
        return Result.success(userDtoList);
    }

}
